<?php

/**
 * Code for using a proxy XRI resolver.
 */

// Do not allow direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

require_once 'Auth/Yadis/XRDS.php';
require_once 'Auth/Yadis/XRI.php';

class Auth_Yadis_ProxyResolver {
	function Auth_Yadis_ProxyResolver(&$fetcher, $proxy_url = null)
	{
		$this->fetcher =& $fetcher;
		$this->proxy_url = $proxy_url;
		if (!$this->proxy_url) {
			$this->proxy_url = Auth_Yadis_getDefaultProxy();
		}
	}

	function queryURL($xri, $service_type = null)
	{
		// trim off the xri:// prefix
		$qxri = substr(Auth_Yadis_toURINormal($xri), 6);
		$hxri = $this->proxy_url . $qxri;
		$args = array(
					  '_xrd_r' => 'application/xrds+xml'
					  );

		if ($service_type) {
			$args['_xrd_t'] = $service_type;
		} else {
			// Don't perform service endpoint selection.
			$args['_xrd_r'] .= ';sep=false';
		}

		$query = Auth_Yadis_XRIAppendArgs($hxri, $args);
		return $query;
	}

	function query($xri, $service_types, $filters = array())
	{
		$services = array();
		$canonicalID = null;
		foreach ($service_types as $service_type) {
			$url = $this->queryURL($xri, $service_type);
			$response = $this->fetcher->get($url);
			if ($response->status != 200 and $response->status != 206) {
				continue;
			}
			$xrds = Auth_Yadis_XRDS::parseXRDS($response->body);
			if (!$xrds) {
				continue;
			}
			$canonicalID = Auth_Yadis_getCanonicalID($xri,
														 $xrds);

			if ($canonicalID === false) {
				return null;
			}

			$some_services = $xrds->services($filters);
			$services = array_merge($services, $some_services);
			// TODO:
			//  * If we do get hits for multiple service_types, we're
			//	almost certainly going to have duplicated service
			//	entries and broken priority ordering.
		}
		return array($canonicalID, $services);
	}
}

?>
